/* A simple server in the internet domain using TCP
 The port number is passed as an argument */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>

void error(const char *msg)
{
  perror(msg);
  exit(1);
}

int main(int argc, char *argv[])
{
  int sockfd, newsockfd, portno;
  socklen_t clilen;
  char buffer[256];
  struct sockaddr_in serv_addr, cli_addr;
  int n;
  argv[1] = "1234";

  sockfd = socket(AF_INET, SOCK_STREAM, 0);
  if (sockfd < 0)
    error("ERROR opening socket");
  bzero((char *) &serv_addr, sizeof(serv_addr));
  portno = atoi(argv[1]);
  serv_addr.sin_family = AF_INET;
  serv_addr.sin_addr.s_addr = INADDR_ANY;
  serv_addr.sin_port = htons(portno);
  if (bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0)
    error("ERROR on binding");
  listen(sockfd, 5);
  clilen = sizeof(cli_addr);
  newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen);
  if (newsockfd < 0)
    error("ERROR on accept");
  bzero(buffer, 256);
  n = read(newsockfd, buffer, 255);
  if (n < 0)
    error("ERROR reading from socket");
  printf("Here is the message: \n%s\n", buffer);

  sleep(2);
  n = write(newsockfd, "HTTP/1.1 200 OK\r\n\r\n", 19);
  printf("n = %d\n", n);

  int isSeted = 0;
  int sendsize = 0;
  char buf[14600];
  size_t size;
//  FILE *fp = fopen("new.ts", "rb");
  FILE *fp = fopen("1.flv", "rb");
//  FILE *fp = fopen("aabb.flv", "rb");
//  FILE *fp = fopen("Glamorous.mkv", "rb");
  while (!feof(fp))
  {
    size = fread(buf, sizeof(char), 14600, fp);
    n = write(newsockfd, buf, size);
    usleep(10);
    sendsize += size;
    printf("sendsize = %d\n", sendsize);

    if (!isSeted && sendsize > 1573440)
    {
      fseek(fp, 20484224, SEEK_SET);
      isSeted = 1;
    }

//    if (sendsize > 573440)
//    {
//      fseek(fp, 188 * 10, SEEK_SET);
//      printf("break>>>>>>>>>>>>");
//      write(newsockfd, "\0", 1);
//      break;
//    }

//    if (sendsize > 2732032)
//    {
//      printf("break>>>>>>>>>>>>");
//      break;
//    }
  }
//
//  sleep(2);
//  while (1)
//  {
//  memset(buf, 0, 4096);
//  n = write(newsockfd, buf, 4096);
//  printf("n = %d\n", n);
//  }
//  sleep(2);
//  char *res = "HTTP/1.1 404 Not Found\r\n\r\n";
//  n = write(newsockfd, res, strlen(res));
//  printf("n = %d\n", n);
//  sleep(2);
//
//  fp = fopen("Glamorous.mkv", "rb");
//  while (!feof(fp))
//  {
//    size = fread(buf, sizeof(char), 4096, fp);
//    n = write(newsockfd, buf, size);
//    usleep(10);
//    sendsize += size;
//    printf("sendsize = %d\n", sendsize);
//  }

  sleep(1);
  if (n < 0)
    error("ERROR writing to socket");
  close(newsockfd);
  close(sockfd);
  return 0;
}
